﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CMU.Certificates;
using System.Data;
using System.Data.OleDb;
using System.Data.Entity;
namespace CMU.Import
{
    class Import
    {
        CertificateEntities context = new CertificateEntities();
        public DataTable getComboData()
        {
            //lay du lieu tu database 
            var combodata = from p in context.LopHoc
                            join q in context.GiangVien on p.Id_GV equals q.Id
                            join t in context.MonHoc on p.Id_MH equals t.Id
                            join x in context.ThoiGian on p.Id_TG equals x.Id
                            select new { p.Id, t.TenMH, x.NamHoc, x.HocKy, q.TenGV };
            DataTable combo = new DataTable();
            combo.Columns.Add("ID", typeof(int));
            combo.Columns.Add("CLASSID", typeof(int));
            combo.Columns.Add("value", typeof(string));
            // lay du lieu tu database gan vo datatable roi them 1 column value
            foreach (var item in combodata)
            {
                DataRow dr = combo.NewRow();
                dr["ID"] = item.Id;
                dr["CLASSID"] = item.Id;
                dr["value"] = item.TenMH + "_" + item.NamHoc + "_" + item.HocKy + "_" + item.TenGV;
                combo.Rows.Add(dr);
            }
            return combo;
        }

        public int ImportFromExcel(int classID, string filename, ref List<string> sameID)
        {
            //excel khong co du lieu return 0, add thanh cong return 1, co du lieu trung return 2
            //lay data tu file excel gan vao datatable
            DataTable data = ReadExcelFile(filename);
            if (data == null || data.Rows.Count == 0 )
            {
                return 0;
            }
            int res = 1;
            for (int i = 0; i < data.Rows.Count; i++)
            {
                string studentID = data.Rows[i][0].ToString();
                string FirstName = data.Rows[i][1].ToString();
                string MiddleName = data.Rows[i][2].ToString();
                string LastName = data.Rows[i][3].ToString();
                byte Gender = Convert.ToByte((data.Rows[i][4].ToString() == "Male") ? 1 : 0);
                double Score = Convert.ToDouble(data.Rows[i][5]);
                var id = from p in context.SinhVien
                         where p.MaSV == studentID
                         select p;
                if (id == null || id.Count() == 0)
                {
                    var id_kh = context.LopHoc.Single(p => p.Id == classID);
                    SinhVien SV = new SinhVien();
                    SV.MaSV = studentID;
                    SV.Id_KH = id_kh.Id_KH;
                    SV.FirstName = FirstName;
                    SV.MiddleName = MiddleName;
                    SV.LastName = LastName;
                    SV.Gender = Gender;
                    string temp = "";
                    while (MiddleName.LastIndexOf(" ") != -1)
                    {
                        temp = temp + " " + MiddleName.Substring(MiddleName.LastIndexOf(" ") + 1);
                        MiddleName = MiddleName.Substring(0, MiddleName.LastIndexOf(" "));
                    }
                    temp = temp + " " + MiddleName;
                    MiddleName = temp;
                    MiddleName = (MiddleName == null || MiddleName.Equals("")) ? "" : (MiddleName + " ");
                    SV.HoVaTen = LastName + MiddleName + FirstName;
                    try
                    {
                        context.SinhVien.Add(SV);
                        context.SaveChanges();
                    }
                    catch
                    {

                    }
                }
                else
                {
                    var a = context.SinhVien.Single(p => p.MaSV == studentID);
                    if (context.SinhVien.Find(a.Id) == null)
                    {
                        var id_kh = context.LopHoc.Single(p => p.Id == classID);
                        SinhVien SV = new SinhVien();
                        SV.MaSV = studentID;
                        SV.Id_KH = id_kh.Id_KH;
                        SV.FirstName = FirstName;
                        SV.MiddleName = MiddleName;
                        SV.LastName = LastName;
                        SV.Gender = Gender;
                        string temp = "";
                        while (MiddleName.LastIndexOf(" ") != -1)
                        {
                            temp = temp + " " + MiddleName.Substring(MiddleName.LastIndexOf(" ") + 1);
                            MiddleName = MiddleName.Substring(0, MiddleName.LastIndexOf(" "));
                        }
                        temp = temp + " " + MiddleName;
                        MiddleName = temp;
                        MiddleName = (MiddleName == null || MiddleName.Equals("")) ? "" : (MiddleName + " ");
                        SV.HoVaTen = LastName + MiddleName + FirstName;
                        try
                        {
                            context.SinhVien.Add(SV);
                            context.SaveChanges();
                        }
                        catch
                        {
                        }
                    }
                }

                var b = context.SinhVien.Single(p => p.MaSV == studentID);
                int v = b.Id;
                var compare = from p in context.ChungChi
                              where p.Id_SV == v && p.Id_LH == classID
                              select p;
                if (context.ChungChi.Count() == 0)
                {
                    ChungChi CC = new ChungChi();
                    CC.Id_LH = classID;
                    CC.Id_SV = v;
                    CC.Diem = Score;
                    try
                    {
                        context.ChungChi.Add(CC);
                        context.SaveChanges();
                    }
                    catch
                    {
                    }
                }
                else
                {
                    if (compare == null || compare.Count() == 0)
                    {
                        ChungChi CC = new ChungChi();
                        CC.Id_LH = classID;
                        CC.Id_SV = v;
                        CC.Diem = Score;
                        try
                        {
                            context.ChungChi.Add(CC);
                            context.SaveChanges();
                        }
                        catch
                        {
                        }
                    }
                    else
                    {
                        sameID.Add(studentID);
                        res = 2;
                    }
                }
            }
            return res;
        }

        private DataTable ReadExcelFile(string path)
        {
            string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";
            // Tạo đối tượng kết nối
            OleDbConnection oledbConn = new OleDbConnection(connectionString);
            DataTable data = new DataTable();
            try
            {
                // Mở kết nối
                oledbConn.Open();
                // Tạo đối tượng OleDBCommand và query data từ sheet có tên "Sheet1"
                OleDbCommand cmd = new OleDbCommand("SELECT * FROM [Sheet1$]", oledbConn);
                // Tạo đối tượng OleDbDataAdapter để thực thi việc query lấy dữ liệu từ tập tin excel
                OleDbDataAdapter oleda = new OleDbDataAdapter();
                oleda.SelectCommand = cmd;
                // Tạo đối tượng DataSet để hứng dữ liệu từ tập tin excel
                // Đổ đữ liệu từ tập excel vào DataSet
                oleda.Fill(data);
            }
            catch
            {
            }
            finally
            {
                oledbConn.Close();
            }
            return data;
        }
    }
}